20 常用图形绘制
20.1 引言选择合适的图表
不同数据类型需要不同的图表: - 时间序列: 折线图 - 分类比较: 柱状图、条形图 - 相关性: 散点图 - 占比: 饼图 - 分布: 直方图、密度图
20.2 中国GDP省份排名TOP5
平台任务解答代码
以下代码与教学平台任务要求完全一致:
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
# 导入模块
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用黑体显示中文
# 构建数据
GDP = [129118.6,122875.6,87435.1,77715.4,61345.1]
# 绘图
plt.bar(range(5),GDP,align = "center",color = "steelblue",alpha = 0.6)
# 添加y轴标签
plt.ylabel("GDP:亿元人民币")
# 设置Y轴的刻度范围
plt.ylim([40000,150000])
# 添加x轴刻度标签
plt.xticks(range(5),['广东省','江苏省','山东省','浙江省','河南省'])
# 添加标题
plt.title('2022年中国GDP排名前5的省份')
# 为每个条形图添加数值标签
for x,y in enumerate(GDP):
plt.text(x,y+300,s=y,ha='center') # 添加文本标注
# 保存图形
plt.savefig("1.png")
plt.show() # 显示图形# =============================================================================
# 题目:中国GDP排名TOP5省份的双向对比可视化
# =============================================================================
# 本代码使用真实数据(2022年各省份GDP)创建柱状图和条形图,展示中国经济
# 规模最大的五个省份。通过纵向和横向两种可视化方式,帮助理解数据的
# 排名和相对差距。柱状图强调数值高度,条形图便于阅读长标签。
# ==================== 导入必要的库 ====================
import matplotlib.pyplot as plt # 导入Matplotlib库,用于绘制图表
import pandas as pd # 导入Pandas库,用于数据处理和存储
# ==================== 准备GDP数据 ====================
# 定义包含2022年GDP数据(单位:亿元)的字典
data = {
'省份': ['广东', '江苏', '山东', '浙江', '河南'], # GDP排名前五的省份名称
'GDP': [129118, 122875, 87435, 77715, 61345] # 对应的GDP数值(单位:亿元人民币)
}
# 将字典转换为DataFrame,便于数据处理和可视化
df = pd.DataFrame(data) # DataFrame是二维表格结构,包含省份和GDP两列
# ==================== 设置中文字体 ====================
# 配置Matplotlib以正确显示中文字符
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为黑体(SimHei),支持中文显示
# SimHei是Windows系统自带的中文字体,也可使用'Microsoft YaHei'(微软雅黑)
# 解决负号显示问题(默认负号显示为方块,需要特殊配置)
plt.rcParams['axes.unicode_minus'] = False # 将负号显示为正常的减号,而非Unicode字符
# ==================== 创建1x2的子图布局 ====================
# 创建一个包含1行2列共2个子图的画布,总尺寸为14x6英寸
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# figsize参数的第一个值是宽度,第二个值是高度,单位为英寸
# axes是一个包含2个子图对象的列表,可通过axes[0]和axes[1]访问
# ==================== 子图1:纵向柱状图 ====================
# 绘制纵向柱状图,柱子高度对应GDP值
axes[0].bar(df['省份'], df['GDP'], color='steelblue', edgecolor='black')
# 第一个参数是x轴数据(省份名称)
# 第二个参数是y轴数据(GDP数值)
# color参数设置柱子填充色为钢蓝色
# edgecolor参数设置柱子边框为黑色,增强视觉边界
# 设置子图1的标题,字体大小14
axes[0].set_title('中国GDP排名TOP5(柱状图)', fontsize=14)
# 设置x轴标签,字体大小12
axes[0].set_xlabel('省份', fontsize=12)
# 设置y轴标签,说明单位
axes[0].set_ylabel('GDP(亿元)', fontsize=12)
# 添加水平网格线,仅沿y轴方向,透明度为0.3
axes[0].grid(axis='y', alpha=0.3) # axis='y'表示仅显示y轴方向的网格线
# ==================== 添加数值标签(柱状图) ====================
# 在每个柱子上方显示具体的GDP数值
for i, v in enumerate(df['GDP']): # 遍历GDP数据,i是索引(0-4),v是GDP数值
# 在柱子顶部添加文本标签
axes[0].text(i, v + 2000, f'{v:,}', ha='center', fontsize=10)
# i是x坐标(柱子的水平位置)
# v + 2000是y坐标(柱子顶部上方2000单位处,避免文字与柱子重叠)
# f'{v:,}'是格式化字符串,逗号作为千位分隔符(如"129,118")
# ha='center'表示水平居中对齐
# fontsize=10设置字体大小
# ==================== 子图2:横向条形图 ====================
# 绘制横向条形图,条形长度对应GDP值
axes[1].barh(df['省份'], df['GDP'], color='coral', edgecolor='black')
# barh是horizontal bar的缩写,绘制横向条形图
# 第一个参数是y轴数据(省份名称)
# 第二个参数是x轴数据(GDP数值)
# color参数设置条形填充色为珊瑚色
# edgecolor参数设置条形边框为黑色
# 设置子图2的标题
axes[1].set_title('中国GDP排名TOP5(条形图)', fontsize=14)
# 设置x轴标签(条形图的横轴是数值)
axes[1].set_xlabel('GDP(亿元)', fontsize=12)
# 添加垂直网格线,仅沿x轴方向,透明度为0.3
axes[1].grid(axis='x', alpha=0.3) # axis='x'表示仅显示x轴方向的网格线
# ==================== 添加数值标签(条形图) ====================
# 在每个条形右侧显示具体的GDP数值
for i, v in enumerate(df['GDP']): # 遍历GDP数据
# 在条形右端添加文本标签
axes[1].text(v + 2000, i, f'{v:,}', va='center', fontsize=10)
# v + 2000是x坐标(条形右端右侧2000单位处)
# i是y坐标(条形的垂直位置)
# va='center'表示垂直居中对齐
# f'{v:,}'格式化数值,添加千位分隔符
# ==================== 调整布局并显示图表 ====================
# tight_layout()自动调整子图间距,防止标签和标题重叠
plt.tight_layout() # 优化布局,确保所有元素清晰可见
# 显示完整的图表
plt.show() # 将两个子图作为一个整体展示
# ==================== 计算和输出统计信息 ====================
# 计算五省GDP总和
total_gdp = df['GDP'].sum() # sum()方法计算Series所有元素的总和
# 计算各省GDP占五省总和的百分比
gdp_share = df['GDP'] / total_gdp * 100 # 逐元素除法,返回百分比Series
# 打印格式化的详细数据
print("\n详细数据:")
for _, row in df.iterrows(): # 遍历DataFrame的每一行
# _是索引(本例中不需要使用),row是一个Series,包含该行的所有列
print(f"{row['省份']}: {row['GDP']:,}亿元")
# row['省份']访问省份列
# row['GDP']访问GDP列,格式化为带千位分隔符的数值
# 打印五省GDP总计
print(f"\n五省GDP总计: {total_gdp:,}亿元")
# 计算占全国GDP的比例(假设全国为100万亿元)
print(f"\n占全国GDP比例(假设全国为100万亿): {total_gdp/1000000:.1%}")
# 100万亿 = 1000000亿元
# .1%表示格式化为百分比,保留1位小数
# 输出解读:
# 图表显示广东省GDP最高(12.9万亿),江苏省紧随其后(12.3万亿),两省经济规模接近
# 山东第三(8.7万亿),与第一梯队有较大差距
# 浙江和河南分别位列第四和第五
# 五省GDP总计约47.8万亿,占全国近一半,体现了经济集中的现象
# 柱状图便于比较高度差异,条形图便于阅读省份名称20.3 图表选择指南
| 数据类型 | 推荐图表 | 说明 |
|---|---|---|
| 时间序列 | 折线图 | 展示趋势 |
| 分类比较 | 柱状图/条形图 | 比较大小 |
| 相关性 | 散点图 | 观察关系 |
| 占比 | 饼图 | 显示份额 |
| 分布 | 直方图/箱线图 | 显示分布 |
20.4 高级技巧
# =============================================================================
# 题目:双轴图(双y轴)的高级可视化技术
# =============================================================================
# 本代码演示如何创建双轴图表,即在同一个x轴上展示两个不同量纲或数量级
# 的变量。这在金融数据分析中非常常见,例如同时展示股票收益率和成交量。
# 左y轴显示收益率(百分比),右y轴显示成交量(股数),便于观察二者的关系。
# ==================== 导入必要的库 ====================
import matplotlib.pyplot as plt # 导入Matplotlib库,用于绘图
import numpy as np # 导入NumPy库,用于生成模拟数据
# ==================== 创建复杂图表布局 ====================
# 创建一个空白画布,不创建子图
fig = plt.figure(figsize=(12, 8)) # 画布尺寸为12x8英寸
# 使用GridSpec创建复杂的网格布局(2行2列)
gs = fig.add_gridspec(2, 2, hspace=0.3, wspace=0.3)
# hspace控制子图之间的垂直间距(占子图高度的比例)
# wspace控制子图之间的水平间距(占子图宽度的比例)
# 0.3表示间距为子图大小的30%
# ==================== 子图1:双轴图 ====================
# 在网格的第一行添加一个跨两列的子图
ax1 = fig.add_subplot(gs[0, :]) # gs[0, :]表示第0行,所有列(跨两列)
# ==================== 生成模拟数据 ====================
# 创建x轴数据(0-9的整数序列)
x = np.arange(10) # 生成[0, 1, 2, ..., 9],代表时间点
# 生成y1数据(收益率):随机数的累积和
y1 = np.random.randn(10).cumsum() # randn生成10个标准正态分布随机数,cumsum计算累积和
# 模拟收益率随时间的变化,可能为正也可能为负
# 生成y2数据(成交量):随机数的累积和乘以100
y2 = np.random.randn(10).cumsum() * 100
# 乘以100使成交量的数量级远大于收益率,适合双轴展示
# ==================== 绘制第一条曲线(左y轴) ====================
# 在ax1上绘制收益率曲线
ax1.plot(x, y1, 'b-', label='收益率', linewidth=2)
# 'b-'表示蓝色实线(b=blue, -=实线)
# label参数设置图例文本
# linewidth=2设置线宽为2个像素
# 设置左y轴标签(收益率)
ax1.set_xlabel('时间', fontsize=12) # 设置x轴标签,字体大小12
ax1.set_ylabel('收益率', fontsize=12, color='b') # 设置左y轴标签,颜色为蓝色
# color='b'使标签颜色与曲线颜色一致,增强视觉关联
# 设置左y轴刻度标签的颜色
ax1.tick_params(axis='y', labelcolor='b') # 将左y轴的刻度数字设为蓝色
# 在左上角添加图例
ax1.legend(loc='upper left') # loc='upper left'指定图例位置在左上角
# ==================== 创建并绘制第二条曲线(右y轴) ====================
# 创建与ax1共享x轴的新y轴
ax2 = ax1.twinx() # twinx()创建一个与ax1共享x轴的新坐标系,但有独立的y轴
# 这样可以在同一图表上绘制两条不同量纲的曲线
# 在ax2上绘制成交量曲线
ax2.plot(x, y2, 'r-', label='成交量', linewidth=2)
# 'r-'表示红色实线(r=red)
# 这条曲线使用右侧的y轴刻度
# 设置右y轴标签(成交量)
ax2.set_ylabel('成交量', fontsize=12, color='r') # 标签颜色为红色
# 右y轴的刻度范围自动根据y2数据调整
# 设置右y轴刻度标签的颜色
ax2.tick_params(axis='y', labelcolor='r') # 将右y轴的刻度数字设为红色
# 在右上角添加图例
ax2.legend(loc='upper right') # loc='upper right'指定图例位置在右上角
# ==================== 设置总标题 ====================
# 为整个双轴图设置标题
ax1.set_title('双轴图:收益率与成交量', fontsize=14) # 标题字体大小14
# 虽然ax1和ax2是两个坐标系,但它们共享画布,任一坐标系设置标题即可
# ==================== 显示图表 ====================
plt.show() # 展示完整的双轴图
# 输出解读:
# 双轴图是金融分析的利器,可以同时观察两个相关但量纲不同的变量
# 例如:股票价格(左轴)和成交量(右轴)、利率(左轴)和通胀率(右轴)
# 左侧的蓝色曲线表示收益率的变化趋势,右侧的红色曲线表示成交量的变化
# 通过双轴图,可以观察两个变量是否存在相关关系(如成交量是否随收益率增加)
# 注意:双轴图可能产生视觉误导,需谨慎使用,确保两个变量确实相关且值得同时展示